/*
 * @Date: 2023-01-22 02:17:37
 * @LastEditors: 恶名扬 2080156129@qq.com
 * @LastEditTime: 2023-01-24 05:17:42
 * @FilePath: \campus-repair-platform\server\service\reception\userinfo.js
 */
/**
 * getUserinfo  获取个人信息
 * getUserinfoType  获取个人类型
 * getCode      获取当前手机号验证码
 * newCode      获取新手机号验证码
 * validCode    验证验证码
 * updatePhone      修改手机号
 * updatePwdOldPwd  修改密码
 */
// 导入密码解密
const bcrypt = require("bcryptjs")
const { send, verify } = require("../../common/verify_code")
const { userStatement, getCode } = require("../common/user")

exports.getUserinfo = async (req, res) => {
  const userinfo = req.auth
  try {
    const sqlStr = userStatement(userinfo.type).idSelect(userinfo.id)
    let results = await RunSQL(sqlStr)
    if (results.length !== 1) return res.successSend("获取个人信息失败！", 10005) // 执行语句成功，但获取到的数据条数非 1

    res.successSend("", 10000, results[0])
  } catch (error) {
    res.errSend(error)
  }
}

exports.getUserinfoType = async (req, res) => {
  const info = req.auth
  const type = {
    1: '学生',
    2: '维修人员',
    3: '管理员',
    4: '高级管理员'
  }
  return res.successSend("", 10000, { type: info.type, name: type[info.type] })
}

exports.getCode = async (req, res) => {
  const data = req.auth
  return getCode(res, data)
}

exports.newCode = async (req, res) => {
  const data = req.body
  try {
    const sqlStr = userStatement(req.auth.type).selectPhone(data.phone)
    // 操作数据库判断手机号是否已存在
    let results = await RunSQL(sqlStr)
    if (results.length) return res.successSend("手机号已存在！", 10005) // 执行语句成功，但影响函数不等于 1
    // 发送短信验证码
    send(data.phone).then(
      (result) => {
        return res.successSend("短信发送成功") // 发送成功
      },
      (ex) => {
        return res.errSend(ex)
      }
    )
  } catch (error) {
    res.errSend(error) // 返回错误信息
  }
}

exports.validCode = async (req, res) => {
  const data = req.body
  // 验证验证码
  const valid = await verify(data.phone, data.code)
  if (valid === '验证码过期！') res.errSend(valid, 10010)
  if (valid === '验证通过！') res.successSend(valid) // 修改成功
  else res.errSend(valid)
}

exports.updatePhone = async (req, res) => {
  const data = req.body
  try {
    // 判断验证码是否正确
    const valid = await verify(data.phone, data.code)
    if (valid === '验证码过期') res.errSend(valid, 10010)
    if (valid === '验证通过！') {
      const userinfo = req.auth
      const sqlStr = userStatement(userinfo.type).idUpdate(
        { phone: req.body.phone },
        userinfo.id
      )

      // 操作数据库修改手机号
      let results = await RunSQL(sqlStr)
      if (results.affectedRows !== 1) return res.successSend("修改手机号失败！", 10005) // 执行语句成功，但影响函数不等于 1
      return res.successSend("修改手机号成功！") // 修改成功
    } else res.errSend(valid)
  } catch (error) {
    res.errSend(error) // 返回错误信息
  }
}

exports.updatePwdOldPwd = async (req, res) => {
  try {
    const data = req.body
    const userinfo = req.auth

    let sqlStr = userStatement(userinfo.type).idSelect(userinfo.id, "password")
    // 查询旧密码是否正确
    let results = await RunSQL(sqlStr)
    if (results.length !== 1) return res.successSend("根据Id查找信息失败！", 10005) // 执行语句成功，但影响函数不等于 1
    if (!bcrypt.compareSync(data.oldPassword, results[0].password))
      return res.errSend("旧密码错误！") // 判断密码是否正确

    // 修改密码
    sqlStr = userStatement(userinfo.type).idUpdate(
      { password: bcrypt.hashSync(data.newPassword, 10) },
      userinfo.id
    )
    results = await RunSQL(sqlStr)
    if (results.affectedRows !== 1) return res.successSend("修改密码失败！", 10005) // 执行语句成功，但影响函数不等于 1
    return res.successSend("修改密码成功！", 10000, results[0])
  } catch (error) {
    res.errSend(error) // 返回错误信息
  }
}

exports.logout = async (req, res) => {
  try {
    const id = req.auth.id
    redisClient.SREM(id,'login',  (err, result) => {
      if (err) return res.errSend("退出登录失败！")
      else if (result) return res.successSend("退出登录成功！")
    })
  } catch (error) {
    res.errSend(error)
  }
}
